package 遍历器;

import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStreamRewriter;
import 抽象语法树节点.后缀表达式.方法调用表达式;
import 抽象语法树节点.抽象语法树;

// 用来输出类型提升后的源码
public class 类型提升监听器 extends 抽象语法树基础监听器 {
    public 类型提升监听器(CommonTokenStream 符号流) {
        this.符号流 = 符号流;
        改写器 = new TokenStreamRewriter(符号流);
    }

    private final CommonTokenStream 符号流;
    private final TokenStreamRewriter 改写器;
    public final 日志 日志 = new 日志();
    

    public String 取输出文本() {
        return 改写器.getText();
    }


    @Override
    public void 离开抽象语法树(抽象语法树 节点) {
        if (节点.类型提升 == null) return;
        var token = 符号流.get(节点.起始Token索引);
        日志.信息("行 " + token.getLine() + " " + token + " 类型提升 " + 节点.类型提升);
        插入类型转换(节点);
    }

    private void 插入类型转换(抽象语法树 节点) {
        if (节点.类型提升 == null) return;
        var 类型转换表达式 = 标蓝("(" + 节点.类型提升.取名称() + ")");
        if (节点.起始Token索引 == 节点.结束Token索引 || 
                节点 instanceof 方法调用表达式) { // 注意这里没有成员访问表达式
            改写器.insertBefore(节点.起始Token, 类型转换表达式);
        } else {
            改写器.insertBefore(节点.起始Token, 类型转换表达式 + 标蓝("("));
            改写器.insertAfter(节点.结束Token, 标蓝(")"));
        }
    }
    
    private static String 标蓝(String text) {
        return "\u001B[34m" + text + "\u001B[0m";
    }
}
